/**
 * 
 */
package hb_Teach_InitObject_abstract;

import org.junit.Test;

/**
 * 模板方法设计模式
 * Abstract使用案例——重写子类方法
 * @author Jiang Zhiyan
 *
 * 2021年5月24日 下午 9：03
 */
public class AbstractTemplate {
	@Test
  public void templateTest(){
	  Sub01 s1 = new Sub01();
	  s1.template();
	  
	 Sub02 s2 = new Sub02();
	 s2.template();
	 
	 Sub03 s3 = new Sub03();
	 s3.template();
  }
}
/**
 * 如果不使用abstract方法，则改成
 * class BaseTemplateMethod{
	public void dosomething() {	
	};  //主要区别在于abstract定义的方法没有方法体，其方法应在其子类中实现
 */
abstract class BaseTemplateMethod{
	//抽象方法由子类实现
	public abstract void dosomething();
	
	public void template() {
		System.out.println("固有流程1.");
		System.out.println("\t 固有流程 1.1...");
		System.out.println("固有流程2.");
		this.dosomething();
		System.out.println("固有流程3.");
		System.out.println("固有流程4.");
	}
}
class Sub01 extends BaseTemplateMethod{
	@Override
	public void dosomething() {
		System.out.println("Sub 01 执行细节...");
	}
}
class Sub02 extends BaseTemplateMethod{
	@Override
	public void dosomething() {
		System.out.println("Sub 02 执行细节...");
	}
}
class Sub03 extends BaseTemplateMethod{
	@Override
	public void dosomething() {
		System.out.println("Sub 03 执行细节...");
	}
}
